/*
 * PrimaryMathView.java
 */
package org.game.math.view;

import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import org.game.math.view.render.ExpressionCellRenderer;

/**
 * The application's main frame.
 */
class PrimaryMathView(app:SingleFrameApplication) extends FrameView(app) {
  private var jCheckBoxMenuItem1:javax.swing.JCheckBoxMenuItem = null;
  private var jCheckBoxMenuItem2:javax.swing.JCheckBoxMenuItem = null;
  private var jCheckBoxMenuItem3:javax.swing.JCheckBoxMenuItem  = null;
  private var  jCheckBoxMenuItem4:javax.swing.JCheckBoxMenuItem = null;
  private var  jCheckBoxMenuItem5:javax.swing.JCheckBoxMenuItem = null;
  private var jMenu1:javax.swing.JMenu  = null;
  private var jMenu2:javax.swing.JMenu  = null;
  private var jMenuItem1:javax.swing.JMenuItem  = null;
  private var  jMenuItem2:javax.swing.JMenuItem = null;
  private var  jMenuItem4:javax.swing.JMenuItem = null;
  private var  jScrollPane1:javax.swing.JScrollPane = null;
  private var  jTable1:javax.swing.JTable = null;
  private var  mainPanel:javax.swing.JPanel = null;
  private var menuBar:javax.swing.JMenuBar  = null;
  private var  progressBar:javax.swing.JProgressBar = null;
  private var  statusAnimationLabel:javax.swing.JLabel = null;
  private var statusMessageLabel:javax.swing.JLabel  = null;
  private var  statusPanel:javax.swing.JPanel = null;
  // End of variables declaration
  private var messageTimer: Timer = null;
  private var busyIconTimer:Timer = null;
  private var idleIcon:Icon = null;
  private var busyIcons:Array[Icon] = Array();
  private var busyIconIndex:Int = 0;
  private var aboutBox:JDialog  = null;

  this.initComponents();
  this.jTable1.setDefaultRenderer(classOf[String], new ExpressionCellRenderer());
  this.jTable1.getColumnModel().getColumn(1).setCellEditor(
    new org.game.math.view.render.InputResultCellEditor(new javax.swing.JTextField()));
  //this.jTable1.getTableHeader().setFont(this.jTable1.getFont());
  // status bar initialization - message timeout, idle icon and busy animation, etc
  val resourceMap:ResourceMap = getResourceMap();
  val messageTimeout:Int = resourceMap.getInteger("StatusBar.messageTimeout").intValue;
  messageTimer = new Timer(messageTimeout, new ActionListener() {

      def actionPerformed(e:ActionEvent):Unit = {
        statusMessageLabel.setText("");
      }
    });
  messageTimer.setRepeats(false);
  val busyAnimationRate:Int = resourceMap.getInteger("StatusBar.busyAnimationRate").intValue;
//  for (i <- 0 to 14) {
//    busyIcons = busyIcons :+ resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
//  }
  (0 to 14).foreach(i => busyIcons = busyIcons :+ resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"));
  busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {

      def actionPerformed(e:ActionEvent):Unit = {
        busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
        statusAnimationLabel.setIcon(busyIcons(busyIconIndex));
      }
    });
  idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
  statusAnimationLabel.setIcon(idleIcon);
  progressBar.setVisible(false);

  // connecting action tasks to status bar via TaskMonitor
  val taskMonitor:TaskMonitor = new TaskMonitor(getApplication().getContext());
  taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

      def propertyChange(evt:java.beans.PropertyChangeEvent):Unit = {
        val propertyName:String = evt.getPropertyName();
        if ("started".equals(propertyName)) {
          if (!busyIconTimer.isRunning()) {
            statusAnimationLabel.setIcon(busyIcons(0));
            busyIconIndex = 0;
            busyIconTimer.start();
          }
          progressBar.setVisible(true);
          progressBar.setIndeterminate(true);
        } else if ("done".equals(propertyName)) {
          busyIconTimer.stop();
          statusAnimationLabel.setIcon(idleIcon);
          progressBar.setVisible(false);
          progressBar.setValue(0);
        } else if ("message".equals(propertyName)) {
          val text:String = evt.getNewValue().asInstanceOf[String];
          if(text == null) {
            statusMessageLabel.setText("");
          }else {
            statusMessageLabel.setText(text);
          }
          messageTimer.restart();
        } else if ("progress".equals(propertyName)) {
          val value:Int = evt.getNewValue().asInstanceOf[Int];
          progressBar.setVisible(true);
          progressBar.setIndeterminate(false);
          progressBar.setValue(value);
        }
      }
    });

  /** This method is called from within the constructor to
   * initialize the form.
   * WARNING: Do NOT modify this code. The content of this method is
   * always regenerated by the Form Editor.
   */
  // <editor-fold defaultstate="collapsed" desc="Generated Code">
  private def initComponents():Unit = {

    mainPanel = new javax.swing.JPanel();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    menuBar = new javax.swing.JMenuBar();
    val fileMenu:javax.swing.JMenu = new javax.swing.JMenu();
    jMenuItem1 = new javax.swing.JMenuItem();
    jMenuItem2 = new javax.swing.JMenuItem();
    val exitMenuItem:javax.swing.JMenuItem = new javax.swing.JMenuItem();
    jMenu1 = new javax.swing.JMenu();
    jCheckBoxMenuItem1 = new javax.swing.JCheckBoxMenuItem();
    jCheckBoxMenuItem2 = new javax.swing.JCheckBoxMenuItem();
    jCheckBoxMenuItem3 = new javax.swing.JCheckBoxMenuItem();
    jCheckBoxMenuItem4 = new javax.swing.JCheckBoxMenuItem();
    jCheckBoxMenuItem5 = new javax.swing.JCheckBoxMenuItem();
    jMenu2 = new javax.swing.JMenu();
    jMenuItem4 = new javax.swing.JMenuItem();
    val helpMenu:javax.swing.JMenu = new javax.swing.JMenu();
    val aboutMenuItem:javax.swing.JMenuItem = new javax.swing.JMenuItem();
    statusPanel = new javax.swing.JPanel();
    val statusPanelSeparator:javax.swing.JSeparator = new javax.swing.JSeparator();
    statusMessageLabel = new javax.swing.JLabel();
    statusAnimationLabel = new javax.swing.JLabel();
    progressBar = new javax.swing.JProgressBar();

    mainPanel.setName("mainPanel"); // NOI18N
    mainPanel.setLayout(new java.awt.BorderLayout());

    jScrollPane1.setName("jScrollPane1"); // NOI18N

    val resourceMap:org.jdesktop.application.ResourceMap = org.jdesktop.application.Application.getInstance(classOf[org.game.math.view.PrimaryMathApp]).getContext().getResourceMap(classOf[PrimaryMathView]);
    jTable1.setFont(resourceMap.getFont("jTable1.font")); // NOI18N
    jTable1.setModel(new org.game.math.view.domain.ExpressionTableModel());
    jTable1.setName("jTable1"); // NOI18N
    jTable1.setRowHeight(56);
    jScrollPane1.setViewportView(jTable1);

    mainPanel.add(jScrollPane1, java.awt.BorderLayout.CENTER);

    menuBar.setName("menuBar"); // NOI18N

    fileMenu.setMnemonic('F');
    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
    fileMenu.setName("fileMenu"); // NOI18N

    jMenuItem1.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.NEW_ACTION));
    jMenuItem1.setMnemonic('C');
    jMenuItem1.setText(resourceMap.getString("jMenuItem1.text")); // NOI18N
    jMenuItem1.setName("jMenuItem1"); // NOI18N
    fileMenu.add(jMenuItem1);

    jMenuItem2.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.CHECK_ACTION));
    jMenuItem2.setMnemonic('d');
    jMenuItem2.setText(resourceMap.getString("jMenuItem2.text")); // NOI18N
    jMenuItem2.setName("jMenuItem2"); // NOI18N
    fileMenu.add(jMenuItem2);

    val actionMap:javax.swing.ActionMap = org.jdesktop.application.Application.getInstance(classOf[org.game.math.view.PrimaryMathApp]).getContext().getActionMap(classOf[PrimaryMathView], this);
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
    exitMenuItem.setName("exitMenuItem"); // NOI18N
    fileMenu.add(exitMenuItem);

    menuBar.add(fileMenu);

    jMenu1.setMnemonic('P');
    jMenu1.setText(resourceMap.getString("jMenu1.text")); // NOI18N
    jMenu1.setName("jMenu1"); // NOI18N

    jCheckBoxMenuItem1.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.ADD_ACTION));
    jCheckBoxMenuItem1.setMnemonic('C');
    jCheckBoxMenuItem1.setSelected(true);
    jCheckBoxMenuItem1.setText(resourceMap.getString("jCheckBoxMenuItem1.text")); // NOI18N
    jCheckBoxMenuItem1.setName("jCheckBoxMenuItem1"); // NOI18N
    jMenu1.add(jCheckBoxMenuItem1);

    jCheckBoxMenuItem2.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.SUB_ACTION));
    jCheckBoxMenuItem2.setMnemonic('T');
    jCheckBoxMenuItem2.setText(resourceMap.getString("jCheckBoxMenuItem2.text")); // NOI18N
    jCheckBoxMenuItem2.setName("jCheckBoxMenuItem2"); // NOI18N
    jMenu1.add(jCheckBoxMenuItem2);

    jCheckBoxMenuItem3.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.MUL_ACTION));
    jCheckBoxMenuItem3.setMnemonic('N');
    jCheckBoxMenuItem3.setText(resourceMap.getString("jCheckBoxMenuItem3.text")); // NOI18N
    jCheckBoxMenuItem3.setName("jCheckBoxMenuItem3"); // NOI18N
    jMenu1.add(jCheckBoxMenuItem3);

    jCheckBoxMenuItem4.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.DIV_ACTION));
    jCheckBoxMenuItem4.setMnemonic('H');
    jCheckBoxMenuItem4.setText(resourceMap.getString("jCheckBoxMenuItem4.text")); // NOI18N
    jCheckBoxMenuItem4.setName("jCheckBoxMenuItem4"); // NOI18N
    jMenu1.add(jCheckBoxMenuItem4);

    jCheckBoxMenuItem5.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.MUL_TABLE_ACTION));
    jCheckBoxMenuItem5.setMnemonic('B');
    jCheckBoxMenuItem5.setText(resourceMap.getString("jCheckBoxMenuItem5.text")); // NOI18N
    jCheckBoxMenuItem5.setName("jCheckBoxMenuItem5"); // NOI18N
    jMenu1.add(jCheckBoxMenuItem5);

    menuBar.add(jMenu1);

    jMenu2.setMnemonic('T');
    jMenu2.setText(resourceMap.getString("jMenu2.text")); // NOI18N
    jMenu2.setName("jMenu2"); // NOI18N

    jMenuItem4.setAction(org.game.math.view.action.ActionManager.getInstance().getAction(org.game.math.view.action.ActionManager.PREFERENCE_ACTION));
    jMenuItem4.setMnemonic('C');
    jMenuItem4.setText(resourceMap.getString("jMenuItem4.text")); // NOI18N
    jMenuItem4.setName("jMenuItem4"); // NOI18N
    jMenu2.add(jMenuItem4);

    menuBar.add(jMenu2);

    helpMenu.setMnemonic('H');
    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
    helpMenu.setName("helpMenu"); // NOI18N

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N
    helpMenu.add(aboutMenuItem);

    menuBar.add(helpMenu);

    statusPanel.setName("statusPanel"); // NOI18N

    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

    progressBar.setName("progressBar"); // NOI18N

    val statusPanelLayout:javax.swing.GroupLayout = new javax.swing.GroupLayout(statusPanel);
    statusPanel.setLayout(statusPanelLayout);
    statusPanelLayout.setHorizontalGroup(
      statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addGap(149, 149, 149)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                          .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 241, Short.MaxValue)
                          .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, statusPanelLayout.createSequentialGroup()
                                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(statusAnimationLabel)
                                    .addContainerGap())))
    );
    statusPanelLayout.setVerticalGroup(
      statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MaxValue)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                          .addComponent(statusMessageLabel)
                          .addComponent(statusAnimationLabel)
                          .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
    );

    setComponent(mainPanel);
    setMenuBar(menuBar);
    setStatusBar(statusPanel);
  }// </editor-fold>
  // Variables declaration - do not modify
}
